package org.jederik.studip.android.view;

import java.io.IOException;

import org.jederik.android.provider.StudIP.Courses;
import org.jederik.android.provider.StudIP.Messages;
import org.jederik.studip.android.R;
import org.jederik.studip.android.conn.exceptions.AuthenticationException;
import org.jederik.studip.android.conn.exceptions.InternalServerErrorException;
import org.jederik.studip.android.conn.exceptions.NotFoundException;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class ViewCourseParticipants extends ListActivity {
	
	private static final String TAG = "ViewCourseParticipants";

	// Darzustellender Inhalt:
	private Cursor cursor = null;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // Ladesymbol in der Titelleiste anfordern:
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

        // Ansicht Laden:
        setListAdapter(null);
        
        // TODO setEmptyView
        TextView empty = new TextView(getApplicationContext());
        empty.setText(R.string.empty);
        this.getListView().setEmptyView(empty);

        // Daten laden und anzeigen:
        load();
	}

    
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);

		// Cursor zum ausgewählten Eintrag bewegen:
		cursor.moveToPosition(position);
		
		// Username des ausgewählten Teilnehmers auslesen:
		String username = cursor.getString(
				cursor.getColumnIndex(Courses.Participants.USERNAME));

		// Versuchen, die Resource anzuzeigen:
		Intent i = new Intent(this, SendMessage.class);
		i = new Intent(
				Intent.ACTION_SEND, 
				Messages.CONTENT_URI);
		i.putExtra("recipient", username);
		startActivity(i);
		
	}
	
	private void load() {
		
		/*
		 * Der Inhalt wird in einem Seperaten Thread heruntergeladen, damit der UI-Thread
		 * nicht blockiert wird. Ein Callback-Mechanismus nimmt die Serverantwort entgegen
		 * und startet das Runnable displayer, welches den empfangenen Inhalt in die Oberfläche
		 * einfügt.
		 */
		
		// Callback-Handler, der auf die Serverantwort reagiert:
		final Handler handler = new Handler() {

			@Override
			public void handleMessage(Message msg) {
				
				switch (msg.what) {
				case 0:
					showDialog(0);
					break;
				case 1:
					displayContent();
					break;
				case 401:
					showDialog(401);
					break;
				case 404:
					showDialog(404);
					break;
				case 500:
					showDialog(500);
					break;
				}
				
    			// Ladesymbol in der Fensterleiste ausblenden:
    			setProgressBarIndeterminateVisibility(false);

				super.handleMessage(msg);
			}
			
		};

    	// In seperatem Thread die Resource anfordern:
    	Thread loadThread = new Thread() {
        	public void run() {
        		
        		Message msg = new Message();

        		try {
            		// Darzustellenden Inhalt laden:
					loadContent();
					msg.what = 1;
				} catch (IOException e) {
					e.printStackTrace();
					msg.what = 0;
				} catch (AuthenticationException e) {
					e.printStackTrace();
					msg.what = 401;
					Bundle data = new Bundle();
					data.putString("msg", e.getMessage());
					msg.setData(data);
				} catch (InternalServerErrorException e) {
					e.printStackTrace();
					msg.what = 500;
					Bundle data = new Bundle();
					data.putString("msg", e.getMessage());
					msg.setData(data);
				} catch (NotFoundException e) {
					e.printStackTrace();
					msg.what = 404;
					Bundle data = new Bundle();
					data.putString("msg", e.getMessage());
					msg.setData(data);
				}
        		
        		// Ist der Inhalt geladen, wird der Handler beauftragt ihn anzuzeigen:
        		handler.sendMessage(msg);
        		
        	}
        };
        
        // Das Ladesymbol wir nun angezeigt:
        setProgressBarIndeterminateVisibility(true);
        
        // Und der Ladevorgang gestartet:
        loadThread.start();
    }
	
	private void displayContent() {
		
		if (cursor == null) return;
		
		// Neuen FeedAdapter als ListAdapter übergeben:
		setListAdapter(new SimpleCursorAdapter(
				this, 
				android.R.layout.simple_list_item_2, 
				cursor, 
				new String[] {
						Courses.Participants.FULLNAME, 
						Courses.Participants.USERNAME
				}, 
				new int[] {
						android.R.id.text1, 
						android.R.id.text2
				}
		));
	}

	@Override
	protected Dialog onCreateDialog(int id) {
		// Art von anzuzeigendem Dialog ermitteln:
		switch (id) {
		case 0:
			// Verbindungsfehler melden:
			return new AlertDialog.Builder(this)
			.setMessage(R.string.service_not_available)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface arg0, int arg1) {

				}
			})
			.create();

		case 401:
			// Misserfolgsmeldung:
			return new AlertDialog.Builder(this)
			.setMessage(R.string.authentication_error)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface arg0, int arg1) {

				}
			})
			.create();

		case 404:
			// Misserfolgsmeldung:
			return new AlertDialog.Builder(this)
			.setMessage(R.string.resource_not_found)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface arg0, int arg1) {

				}
			})
			.create();

		case 500:
			// Misserfolgsmeldung:
			return new AlertDialog.Builder(this)
			.setMessage(R.string.internal_server_error)
			.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface arg0, int arg1) {

				}
			})
			.create();

		default:
			return null;
		}
	}

	private void loadContent() throws IOException, AuthenticationException, InternalServerErrorException, NotFoundException {
		cursor = getContentResolver().query(getIntent().getData(), null, null, null, null);
	}

}
